package LambdaExpress;

import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;

/**
 * Function<T,R>接口是一个函数式风格的接口
 * T, apply方法参数的类型
 * R，apply方法执行后返回的结果的类型
 *
 * 总结： Function接口是一种转换参数类型的方法,常用转换就是将对象转换为字符串...
 * Function 配合 apply()方法
 *
 * 需求：遍历Students对象数组，将年龄大于15岁的学生转换为 姓名-年龄的格式后输出
 */
public class FounctionDemo {
 public static void main(String[] args) {
  SomeThing(
    Student ->{ return Student.getAge()>15;},//predicate接口实现
    Student ->{return Student.getName()+"-"+Student.getAge();},//Function接口实现将Student转换为字符串
    str -> {System.out.println(str);}// Consumer接口的实现, Consumer意为消费者，用于指定如何使用消费（使用）参数str
  );
 }
 public static void SomeThing(
  Predicate<Student> predicate,//用于条件判断
  Function<Student,String> function,//用于将参数转换成字符串
  Consumer<String> consumer //在外部传入事件,这个泛型就是他接收什么类型的值作处理
 ){
  Student[] students=Sort.getStudents();
  for (Student stu:students) {
   //通过predicate断言，判断student是否符合条件
   if(predicate.test(stu)){
      //通过function将student对象转换为字符串
      String str=function.apply(stu);
      consumer.accept(str);
   }
  }
 }
}
